package ar.republicagroup.reportes;

import ar.republicagroup.reportes.bean.ReporteComGestionLiquidBean;
import ar.republicagroup.reportes.util.ConnectionDB;
import ar.republicagroup.reportes.util.Export;
import ar.republicagroup.reportes.util.JavaMailUtil;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.log4j.Logger;


public class App
{
    
   private static Logger log = Logger.getLogger(App.class);
   public static final String CONFIG_FILE_ABSOLUTE_PATH = "C:\\Program Files\\Republica Group\\reports\\config\\config.properties";
   public static final String EXCEL_CONFIG_FILE_ABSOLUTE_PATH = "C:\\Program Files\\Republica Group\\reports\\config\\excel.properties";
   
  public static void main(String[] args)
  {
    try
    {
      Connection myConnection = ConnectionDB.getInstance().getConnection();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      SimpleDateFormat spanishFormat = new SimpleDateFormat("dd-MM-yyyy");
      String fechaFormatoSpanish = null;
      
      if (myConnection != null)
      {
        log.info("Conexion correcta con MariaDB...");  
        Reporte miReporte = new Reporte();
        
        InputStream inputStreamConfig = new FileInputStream(CONFIG_FILE_ABSOLUTE_PATH);
        Properties propsConfig = new Properties();
        propsConfig.load(inputStreamConfig);
        
        String tomarFechaDelSistema = propsConfig.getProperty("system.getdate");
        String fechaDelReporte = null;
        
            if( "1".equals(tomarFechaDelSistema.trim()) ){
                fechaDelReporte = sdf.format(new Date());
                fechaFormatoSpanish = spanishFormat.format(new Date());
            } else {
                log.info("Se activó el ingreso de la fecha manual...");
                log.info("Obteniendo fecha ingresada por el usuario...");
                String fechaDelUsuario = propsConfig.getProperty("manual.date");
                   
                    try{
                       
                       Date fechaDelUsuarioDate = sdf.parse(fechaDelUsuario);
                       fechaDelReporte = sdf.format(fechaDelUsuarioDate);
                       fechaFormatoSpanish = spanishFormat.format(fechaDelUsuarioDate);
                     
                    } catch(ParseException ex) {
                        log.error("La fecha ingresada es incorrecta, verifique que se encuentre en el formato yyyy-MM-dd .");
                        log.error("La app se va a cerrar, ingrese nuevamente la fecha . Revise el archivo config.properties ");
                        System.exit(0);
                    }

            }
        
        log.info("Obteniendo reporte del día : "+fechaDelReporte);    
        
        List<ReporteComGestionLiquidBean> reporteList = miReporte.reporteComisionGestionPorLiquid( fechaDelReporte );
        Map<String,Object> totalesGastosMap = miReporte.getTotalesGastosBancariosAndDiarios( fechaDelReporte );
        totalesGastosMap.put("fechaReporte", fechaFormatoSpanish);
        
        InputStream inputStream = new FileInputStream(EXCEL_CONFIG_FILE_ABSOLUTE_PATH);
        Properties props = new Properties();
        props.load(inputStream);
        String rutaDestino = props.getProperty("excel.pathname");
        String fileName    = fechaFormatoSpanish+"_"+props.getProperty("excel.filename");
        String filePath    = rutaDestino + fileName;
        
        /*Generar el Excel*/
        Export.a_Excel(filePath, reporteList,totalesGastosMap);
        /*Lo enviamos por email...*/
        JavaMailUtil javaMail = JavaMailUtil.getInstance();
        javaMail.enviarMensajeViaSMTP("Reporte de Gestión del día: "+fechaFormatoSpanish,filePath,fileName);
      }
      else
      {
        log.info("No se pudo conectar con MariaDB");
      }
    }
    catch (Exception ex)
    {
      log.error(ex.getMessage(), ex);
    }
  }
}
